package com.itheima.demo2recursion;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class FileSearchGUI extends JFrame {
    private JTextField dirField; // 目录输入框
    private JTextField fileNameField; // 文件名输入框
    private JTextArea resultArea; // 结果显示区域
    private boolean isFound = false; // 标志位，用于控制是否继续搜索
    private static volatile boolean jishiCheck = false; // 是否开启计时
    public static boolean getjishiCheck() {
        return jishiCheck;
    }

    public FileSearchGUI() {
        initializeUI();
    }

    private void initializeUI() {
        setTitle("文件搜索工具");
        setSize(800, 600); // 调整窗口大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        // 主面板
        JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); // 设置明显的黑色边框

        // 输入面板
        JPanel inputPanel = new JPanel(new GridLayout(2, 2, 10, 10));
        inputPanel.add(new JLabel("搜索目录:"));
        dirField = new JTextField();
        inputPanel.add(dirField);
        inputPanel.add(new JLabel("文件名:"));
        fileNameField = new JTextField();
        inputPanel.add(fileNameField);

        // 按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        JButton searchButton = new JButton("搜索");
        searchButton.addActionListener(new SearchButtonListener());
        buttonPanel.add(searchButton);

        // 结果面板
        resultArea = new JTextArea();
        resultArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(resultArea);
        scrollPane.setPreferredSize(new Dimension(700, 400)); // 设置滚动面板大小

        // 添加组件到主面板
        mainPanel.add(inputPanel, BorderLayout.NORTH);
        mainPanel.add(buttonPanel, BorderLayout.CENTER);
        mainPanel.add(scrollPane, BorderLayout.SOUTH);

        // 设置主面板
        add(mainPanel);
    }

    private class SearchButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            String dirPath = dirField.getText();
            String fileName = fileNameField.getText();

            if (dirPath.isEmpty() || fileName.isEmpty()) {
                JOptionPane.showMessageDialog(FileSearchGUI.this, "目录和文件名不能为空！", "错误", JOptionPane.ERROR_MESSAGE);
                return;
            }

            // 清空结果区域
            resultArea.setText("");
            isFound = false; // 重置标志位

            // 启动搜索线程
            new Thread(() -> {
                jishiCheck = true;
                File dir = new File(dirPath);
                searchFile(dir, fileName);
            }).start();
        }
    }

    /**
     * 搜索文件
     *
     * @param dir      搜索的目录
     * @param fileName 搜索的文件名称
     */
    public void searchFile(File dir, String fileName) {
        // 如果已经找到目标文件，则停止搜索
        if (isFound) {
            return;
        }

        // 1、判断极端情况
        if (dir == null || !dir.exists() || dir.isFile()) {
            appendToResultArea("目录无效或不存在！\n");
            return; // 不搜索
        }

        // 显示当前正在打开的目录
        appendToResultArea("正在搜索目录: " + dir.getAbsolutePath() + "\n");

        // 2、获取目录下的所有一级文件或者文件夹对象
        File[] files = dir.listFiles();

        // 3、判断当前目录下是否存在一级文件对象，存在才可以遍历
        if (files != null && files.length > 0) {
            // 4、遍历一级文件对象
            for (File file : files) {
                // 如果已经找到目标文件，则停止搜索
                if (isFound) {
                    return;
                }

                // 5、判断当前一级文件对象是否是文件
                if (file.isFile()) {
                    // 6、判断文件名称是否和目标文件名称一致
                    if (file.getName().contains(fileName)) {
                        appendToResultArea("找到目标文件：" + file.getAbsolutePath() + "\n");
                        appendToResultArea("\n\n----------------搜索成功！----------------\n\n");
                        isFound = true; // 设置标志位为 true
                        jishiCheck = false;

                        try {
                            Runtime r = Runtime.getRuntime();
                            r.exec(file.getAbsolutePath());
                        } catch (Exception e) {
                            appendToResultArea("无法打开文件：" + file.getAbsolutePath() + "\n");
                        }
                        return; // 找到目标文件后停止搜索
                    }
                } else {
                    // 7、如果当前一级文件对象是文件夹，则继续递归调用
                    searchFile(file, fileName);
                }
            }
        } else {
            appendToResultArea("目录为空或无法访问！\n");
        }
    }

    /**
     * 将内容追加到结果区域（线程安全）
     *
     * @param text 要追加的文本
     */
    private void appendToResultArea(String text) {
        SwingUtilities.invokeLater(() -> resultArea.append(text));
    }

    public static void main(String[] args) {
        jishi j = new jishi();
        Callable<Integer> jishiThread = new jishi();
        FutureTask f1 = new FutureTask<>(jishiThread);
        Thread t1 = new Thread(f1);
        t1.start();
        SwingUtilities.invokeLater(() -> {
            FileSearchGUI gui = new FileSearchGUI();
            gui.setVisible(true);
        });
        try {
            System.out.println("总共用时 :  "+f1.get()+"秒.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
// 创建一个线程类 , 用于计时
class jishi extends FileSearchGUI implements Callable {
    int jishi = 0;
    public jishi() {
        super();
    }

    @Override
    public Object call() throws Exception {
        while (FileSearchGUI.getjishiCheck()) {
          // 检查是否开启计时
                try {
                    Thread.sleep(1000);
                    System.out.println("用时" + jishi++ + "秒");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        return jishi;
    }
}